package org.dllwh.dm;

import cn.hutool.core.util.ObjectUtil;
import org.junit.Test;

import java.sql.*;
import java.util.Map;

/**
 * 把今天最好的表现当作明天最新的起点．．～
 * <p>
 * Today the best performance as tomorrow the newest starter!
 *
 * @ClassName DBMSMetaUtil
 * @Description 使用JDBC获取各数据库的Meta信息
 * @Date 2024-11-04 13:01
 * @版本 V 1.0.1
 * @since JDK 17
 */
public class DMMetaDataHelpUtil {

    /**
     * 获取数据库的元信息
     */
    public static void getDatabaseMetaData() throws SQLException {
        Connection connection = DmJdbcHelperUtil.getDmJdbcConnection();
        // 获取DatabaseMetaData对象
        DatabaseMetaData metaData = connection.getMetaData();

        // 打印数据库的一些基本信息
        System.out.println("数据库名称: " + metaData.getDatabaseProductName());
        System.out.println("数据库版本: " + metaData.getDatabaseProductVersion());
        System.out.println("数据库的主版本：" + metaData.getDatabaseMajorVersion());
        System.out.println("数据库的小版本：" + metaData.getDatabaseMinorVersion());
        System.out.println("数据库支持的SQL语法: " + metaData.getSQLKeywords());
        System.out.println("JDBC驱动名称: " + metaData.getDriverName());
        System.out.println("JDBC驱动版本: " + metaData.getDriverVersion());
        System.out.println("数据库已知的用户: " + metaData.getUserName());
        System.out.println("数据库的系统函数的逗号分隔列表: " + metaData.getSystemFunctions());
        System.out.println("数据库的时间和日期函数的逗号分隔列表: " + metaData.getTimeDateFunctions());
        System.out.println("数据库的字符串函数的逗号分隔列表: " + metaData.getStringFunctions());
        System.out.println("数据库供应商用于 'schema' 的首选术语: " + metaData.getSchemaTerm());
        System.out.println("数据库URL: " + metaData.getURL());
        System.out.println("是否允许只读:" + metaData.isReadOnly());
        System.out.println("驱动程序的名称:" + metaData.getDriverName());
        System.out.println("驱动程序的版本:" + metaData.getDriverVersion());
    }

    /**
     * 获取数据库的所有表
     */
    public static void getTableList() throws SQLException {
        Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();
        // 获取Meta信息对象
        DatabaseMetaData meta = conn.getMetaData();
        // 数据库所有者的用户名，一般将它设置为 null。
        String schemaPattern = meta.getUserName();
        // 检索的表的名称，这里设置null，则代表检索全部的表
        String tableNamePattern = null;
        // 想要检索的表的类型
        String[] types = {"TABLE"};
        ResultSet resultSet = meta.getTables(null, schemaPattern, tableNamePattern, types);
        while (resultSet.next()) {
            System.out.println("表名: " + resultSet.getString("TABLE_NAME"));
            System.out.println("注释：" + resultSet.getString("REMARKS"));
        }
    }

    /**
     * 获取数据库的所有表
     */
    @Test
    public void getViewList() throws SQLException {
        Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();
        // 获取Meta信息对象
        DatabaseMetaData meta = conn.getMetaData();
        // 数据库所有者的用户名，一般将它设置为 null。
        String schemaPattern = meta.getUserName();
        // 检索的表的名称，这里设置null，则代表检索全部的表
        String tableNamePattern = null;
        // 想要检索的表的类型
        String[] types = {"VIEW"};
        ResultSet resultSet = meta.getTables(null, schemaPattern, tableNamePattern, types);
        while (resultSet.next()) {
            System.out.println("视图名: " + resultSet.getString("TABLE_NAME"));
            System.out.println("注释：" + resultSet.getString("REMARKS"));
        }
    }

    /**
     * 列出表的所有字段
     */
    public static void getColumnList(String tableName) throws SQLException {
        Connection conn = DmJdbcHelperUtil.getDmJdbcConnection();
        // 获取Meta信息对象
        DatabaseMetaData meta = conn.getMetaData();
        // 数据库的用户
        String schemaPattern = meta.getUserName();
        // 表名
        String tableNamePattern = tableName;//
        // 转换为大写
        if (null != tableNamePattern) {
            tableNamePattern = tableNamePattern.toUpperCase();
        }
        String columnNamePattern = null;
        ResultSet resultSet = meta.getColumns(null, schemaPattern, tableNamePattern, null);
        while (resultSet.next()) {
            ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
            int colNum = resultSetMetaData.getColumnCount();
            for (int i = 1; i <= colNum; i++) {
                // 列名
                // String name = resultSetMetaData.getColumnLabel(i);
                System.out.println("表名：" + resultSet.getString("TABLE_NAME"));
                System.out.println("列名：" + resultSet.getString("COLUMN_NAME"));
                System.out.println("字段类型：" + resultSet.getString("TYPE_NAME"));
                System.out.println("列大小：" + resultSet.getLong("COLUMN_SIZE"));
                System.out.println("是否为空：" + resultSet.getInt("NULLABLE"));
                System.out.println("注释：" + resultSet.getString("REMARKS"));
                System.out.println("默认值：" + resultSet.getString("COLUMN_DEF"));
                System.out.println("是否自递：" + "YES".equalsIgnoreCase(resultSet.getString("IS_AUTOINCREMENT")));
            }
            System.out.println("******************************");
        }
    }

    public static void main(String[] args) throws SQLException {
        
    }
}
